/*
 * Copyright (c) 2024 Huawei Technologies Co., Ltd.
 * openUBMC is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *         http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#include "PCIeEndpoint.h"

namespace mctp_test {

std::vector<uint8_t> PCIeEndpoint::request(
    const std::map<std::string, std::string>& context, // a{ss} - 请求体上下文
    const std::vector<uint8_t>&               data,    // ay - 请求数据
    int32_t                                   timeout, // i - 超时时间
    const std::map<std::string, std::string>&
        ReqHeaderFileds, // a{ss} - mctp上层协议请求报文头字段, 完成协议请求报文头的填充。目前支持,
                         // NCSI协议: 数据包类型 PacketType, 通道标识 ChannelId, 数据包标识
                         // PackageId; NVME协议: 数据完整校验标识 IC, NVME消息类型 MsgType,
                         // 命令插槽标识 CmdSlot; PLDM协议: 报文类型 PldmType, 命令代码 CommandCode
    const std::map<std::string, std::string>&
        RspHeaderValidators // a{ss} - 对mctp上层协议返回报文头的校验。支持校验项: NCSI:
                            // NCSI协议返回数据包类型 PacketType; PLDM协议: 返回命令代码 CommandCode
) {
    // 模拟 MCTP PCIe Endpoint 的请求处理
    // 根据传入的参数构建响应数据

    // 检查请求头字段，模拟 NCSI 协议处理
    if (ReqHeaderFileds.find("PacketType") != ReqHeaderFileds.end()) {
        std::string packet_type            = ReqHeaderFileds.at("PacketType");
        std::string expect_rsp_packet_type = ReqHeaderFileds.at("ExpectRspPacketType");
        std::string channel_id             = ReqHeaderFileds.at("ChannelId");
        std::string package_id             = ReqHeaderFileds.at("PackageId");

        // 模拟 NCSI 协议响应
        // 返回 4 字节的响应数据，模拟 NCSI 响应包
        std::vector<uint8_t> response_data = {0x00, 0x00, 0x00, 0x00};

        // 验证响应头字段（如果提供）
        // if (!RspHeaderValidators.empty()) {
        //     // 这里可以添加响应头验证逻辑
        //     // 例如验证返回的数据包类型是否符合期望
        // }

        return response_data;
    }

    // 如果没有特定的协议头字段，返回空响应
    return std::vector<uint8_t>();
}

void PCIeEndpoint::send(
    const std::map<std::string, std::string>& context, // a{ss} - 请求体上下文
    const std::vector<uint8_t>&               data,    // ay - 请求数据
    const std::map<std::string, std::string>&
        ReqHeaderFileds // a{ss} - mctp上层协议请求报文头字段, 完成协议请求报文头的填充。目前支持,
                        // NCSI协议: 数据包类型 PacketType, 通道标识 ChannelId, 数据包标识
                        // PackageId; NVME协议: 数据完整校验标识 IC, NVME消息类型 MsgType,
                        // 命令插槽标识 CmdSlot; PLDM协议: 报文类型 PldmType, 命令代码 CommandCode
) {
}

} // namespace mctp_test

MC_REFLECT(mctp_test::PCIeEndpoint,
           ((MessageType, "MessageType"))((ServiceName, "ServiceName"))((Status, "Status"))(
               (TargetEid, "TargetEid"))((TargetPhyAddr,
                                          "TargetPhyAddr"))((request, "Request"))((send, "Send")))
